package cn.yunsenlin.formula.cloud.interfaces;

import cn.yunsenlin.formula.cloud.bean.result.Result;
import cn.yunsenlin.formula.cloud.bean.result.ResultRequest;
import cn.yunsenlin.formula.cloud.bean.template.TemplateTest;
import cn.yunsenlin.formula.cloud.mysql.bean.generator.TbResultContent;

import java.util.List;

/**
 * 计算服务
 */
public interface ResultService {
    /**
     * 计算并存储
     *
     * @param request 计算请求
     * @return 计算结果
     */
    Result analyze(ResultRequest request);

    /**
     * 删除计算结果
     *
     * @param resultId 计算结果ID
     */
    void remove(int resultId);

    /**
     * 递归删除计算组和计算组下的所有计算记录
     *
     * @param groupId 计算组ID
     */
    void removeByGroupId(int groupId);

    /**
     * 通过ID查询计算结果
     *
     * @param resultId 计算结果ID
     * @return 计算结果
     */
    Result selectById(int resultId);

    /**
     * 通过计算组和计算公式查询计算结果
     *
     * @param groupId    计算组
     * @param templateId 计算公式
     * @return 计算结果列表
     */
    List<Result> selectByGroupIdAndTemplateId(int groupId, int templateId);

    /**
     * 修改结果
     *
     * @param request 计算请求
     * @return 修改结果
     */
    Result modify(ResultRequest request);

    /**
     * 移动计算组
     *
     * @param resultId 计算结果ID
     * @param groupId  计算组ID
     * @return 移动后的计算组
     */
    Result moveGroup(int resultId, int groupId);

    /**
     * 通过公式和输入项符号检查合法性
     *
     * @param tbResultContentList 输入列表
     * @param templateId          公式ID
     * @param symbol              输入项符号
     * @return 检查结果
     */
    String checkValidWithTemplateId(List<TbResultContent> tbResultContentList, int templateId, String symbol);

    /**
     * 通过公式测试数据和输入项符号检查合法性
     *
     * @param templateTest 输入列表
     * @param columnSymbol 输入项符号
     * @param userId       用户ID
     * @return 检查结果
     */
    String checkValidByTemplateTest(TemplateTest templateTest, String columnSymbol, int userId);

    /**
     * 通过公式测试数据获得计算结果
     *
     * @param templateTest 公式测试数据
     * @return 计算结果
     */
    Result templateTest(TemplateTest templateTest);
}
